home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / mui / bcc_src.lha / Parser / BCC_BUG / Mainwin.bc < prev    next >
Encoding:
Text File  |  1998-01-13  |  10.6 KB  |  418 lines

  1. #include <math.h>
  2. #include <proto/exec.h>
  3. #include <proto/intuition.h>
  4. #include <proto/dos.h>
  5. #include <proto/asl.h>
  6. #include <dos/dos.h>
  7. #include <libraries/asl.h>
  8. #include <intuition/intuition.h>
  9.  
  10. #include "global.h"
  11. #include "model.h"
  12. #include "load.h"
  13. #include "App.bh"
  14. #include "Mainwin.bh"
  15. #include "View.bh"
  16.  
  17. #define fract(n)    (n - floor(n))
  18.  
  19. static __saveds __asm void IntuiMsgFunc(register __a1 struct IntuiMessage *,register __a2 struct FileRequester *);
  20. static char *getfilename(Object *,char *,char *,char *,char);
  21.  
  22. cleardata Method Mainwin::Mainwin():
  23.     MUIA_Window_Title,    "Geotto",
  24.     MUIA_Window_ID,        MAKE_ID('M','A','I','N'),
  25.     MUIA_Window_NeedsMouseObject, TRUE,
  26. /*
  27.     MUIA_Window_CloseGadget, FALSE,
  28.     MUIA_Window_DepthGadget, FALSE,
  29.     MUIA_Window_DragBar, FALSE,
  30.     MUIA_Window_Backdrop, TRUE,
  31.     MUIA_Window_Borderless, TRUE,
  32. */
  33.     WindowContents, VGroup,
  34.         Child, HGroup,
  35.             Child, VGroup,
  36.                 MUIA_Weight, 0,
  37.                 Child, SimpleButton("About"),
  38.                 Child, newobj = KeyButton("New",'n'),
  39.                 Child, TextObject,
  40.                     MUIA_Text_Contents, "Fetch",
  41.                     End,
  42.                 Child, loadobj = KeyButton("Load",'l'),
  43.                 Child, KeyButton("Save",'s'),
  44.                 Child, KeyButton("Save As",'s'),
  45.                 Child, TextObject,
  46.                     MUIA_Text_Contents, "Zoom",
  47.                     End,
  48.                 Child, zoomin = KeyButton("In",'+'),
  49.                 Child, zoomout = KeyButton("Out",'-'),
  50.                 Child, HVSpace,
  51.                 Child, VGroup,
  52.                     TextFrame,
  53.                     MUIA_Background, MUII_TextBack,
  54.                     Child, xcoordtxt = TextObject, End,
  55.                     Child, ycoordtxt = TextObject, End,
  56.                     Child, zcoordtxt = TextObject, End,
  57.                     End,
  58.                 End,
  59.             Child, viewgr = ColGroup(2),
  60.                 MUIA_Group_HorizSpacing, 1,
  61.                 MUIA_Group_VertSpacing, 1,
  62.                 Child, view1 = ViewObject,
  63.                     VirtualFrame,
  64.                     MUIA_View_Mode, MUIV_View_Mode_Top,
  65.                     MUIA_View_X, f2l(0.0),
  66.                     MUIA_View_Y, f2l(0.0),
  67.                     MUIA_View_Z, f2l(0.0),
  68.                     MUIA_View_Zoom, f2l(0.1),
  69.                     MUIA_View_GridSize, f2l(1.0),
  70.                     End,
  71.                 Child, view2 = ViewObject,
  72.                     VirtualFrame,
  73.                     MUIA_View_Mode, MUIV_View_Mode_Persp,
  74.                     MUIA_View_X, f2l(0.0),
  75.                     MUIA_View_Y, f2l(0.0),
  76.                     MUIA_View_Z, f2l(0.0),
  77.                     MUIA_View_Zoom, f2l(0.1),
  78.                     MUIA_View_GridSize, f2l(1.0),
  79.                     End,
  80.                 Child, view3 = ViewObject,
  81.                     VirtualFrame,
  82.                     MUIA_View_Mode, MUIV_View_Mode_Face,
  83.                     MUIA_View_X, f2l(0.0),
  84.                     MUIA_View_Y, f2l(0.0),
  85.                     MUIA_View_Z, f2l(0.0),
  86.                     MUIA_View_Zoom, f2l(0.1),
  87.                     MUIA_View_GridSize, f2l(1.0),
  88.                     End,
  89.                 Child, view4 = ViewObject,
  90.                     VirtualFrame,
  91.                     MUIA_View_Mode, MUIV_View_Mode_Left,
  92.                     MUIA_View_X, f2l(0.0),
  93.                     MUIA_View_Y, f2l(0.0),
  94.                     MUIA_View_Z, f2l(0.0),
  95.                     MUIA_View_Zoom, f2l(0.1),
  96.                     MUIA_View_GridSize, f2l(1.0),
  97.                     End,
  98.                 End,
  99.             End,
  100.         Child, HGroup,
  101.             Child, gridsizetxt = TextObject,
  102.                 TextFrame,
  103.                 MUIA_Background, MUII_TextBack,
  104.                 MUIA_Text_Contents, "Grid:",
  105.                 End,
  106.             Child, poks = SimpleButton("MUI Settings..."),
  107.             End,
  108.         End
  109. {
  110.     obj->Zoom = 0.1;
  111.  
  112.     poks->_Notify(MUIA_Pressed,FALSE,MUIV_Notify_Application,2,MUIM_Application_OpenConfigWindow,0);
  113.  
  114.     newobj->_Notify(MUIA_Pressed,FALSE,obj,1,MUIM_Mainwin_New);
  115.     loadobj->_Notify(MUIA_Pressed,FALSE,obj,1,MUIM_Mainwin_Load);
  116.  
  117.     zoomin->_Notify(MUIA_Pressed,FALSE,obj,1,MUIM_Mainwin_ZoomIn);
  118.     zoomout->_Notify(MUIA_Pressed,FALSE,obj,1,MUIM_Mainwin_ZoomOut);
  119.  
  120.     ehnode.ehn_Priority = 0;
  121.     ehnode.ehn_Flags = 0;
  122.     ehnode.ehn_Object = obj;
  123.     ehnode.ehn_Class = NULL;
  124.     ehnode.ehn_Events = IDCMP_RAWKEY | IDCMP_MOUSEMOVE;
  125.  
  126.     obj->Window_AddEventHandler(&ehnode);
  127.  
  128.     objreq = MUI_AllocAslRequestTags(ASL_FileRequest,
  129.         ASLFR_InitialDrawer,    "3D:",
  130.         ASLFR_InitialPattern,    "#?.(lwo|img)",
  131.         ASLFR_DoPatterns,        TRUE,
  132.         ASLFR_RejectIcons,        TRUE,
  133.         TAG_DONE);
  134.  
  135.     Model = AllocModel();
  136.  
  137. /*    {
  138.     vertex_t *v[8];
  139.     polygon_t *p;
  140.  
  141.     v[0] = AddVertex(Model);    v[0]->x = -1.0;    v[0]->y = 1.0;        v[0]->z = 1.0;
  142.     v[1] = AddVertex(Model);    v[1]->x = 1.0;    v[1]->y = 1.0;        v[1]->z = 1.0;
  143.     v[2] = AddVertex(Model);    v[2]->x = -1.0;    v[2]->y = -1.0;        v[2]->z = 1.0;
  144.     v[3] = AddVertex(Model);    v[3]->x = 1.0;    v[3]->y = -1.0;        v[3]->z = 1.0;
  145.     v[4] = AddVertex(Model);    v[4]->x = -1.0;    v[4]->y = 1.0;        v[4]->z = -1.0;
  146.     v[5] = AddVertex(Model);    v[5]->x = 1.0;    v[5]->y = 1.0;        v[5]->z = -1.0;
  147.     v[6] = AddVertex(Model);    v[6]->x = -1.0;    v[6]->y = -1.0;        v[6]->z = -1.0;
  148.     v[7] = AddVertex(Model);    v[7]->x = 1.0;    v[7]->y = -1.0;        v[7]->z = -1.0;
  149.  
  150.     p = AddPolygon(Model); AddPolyvert(p,v[0]); AddPolyvert(p,v[1]); AddPolyvert(p,v[3]); AddPolyvert(p,v[2]);
  151.     p = AddPolygon(Model); AddPolyvert(p,v[4]); AddPolyvert(p,v[5]); AddPolyvert(p,v[7]); AddPolyvert(p,v[6]);
  152.     p = AddPolygon(Model); AddPolyvert(p,v[0]); AddPolyvert(p,v[1]); AddPolyvert(p,v[5]); AddPolyvert(p,v[4]);
  153.     p = AddPolygon(Model); AddPolyvert(p,v[2]); AddPolyvert(p,v[3]); AddPolyvert(p,v[7]); AddPolyvert(p,v[6]);
  154.     }
  155. */
  156.     //LoadModel("CC:Lambda/orig/freighter.lwo",Model);
  157.     //LoadModel("CC:Lambda/orig/mfighter2.img",Model);
  158.  
  159.     viewgr->View_Model = Model;
  160. }
  161.  
  162. super Method Mainwin::OM_DISPOSE()
  163. {
  164.     obj->Window_RemEventHandler(&ehnode);
  165.     MUI_FreeAslRequest(objreq);
  166.  
  167.     FreeModel(Model);
  168. }
  169.  
  170. super Method Mainwin::MUIM_HandleEvent()
  171. {
  172.     Object *mouseobj = (Object *)obj->Window_MouseObject;
  173.  
  174.     if (msg->imsg)
  175.     {
  176.         if (mouseobj == view1)
  177.         {
  178.             switch(msg->imsg->Class)
  179.             {
  180.                 case IDCMP_RAWKEY:
  181.                     switch(msg->imsg->Code)
  182.                     {
  183.                         case 76:
  184.                             viewgr->View_ScrollZPos();
  185.                             mreturn MUI_EventHandlerRC_Eat;
  186.                             break;
  187.                         case 77:
  188.                             viewgr->View_ScrollZNeg();
  189.                             mreturn MUI_EventHandlerRC_Eat;
  190.                             break;
  191.                         case 79:
  192.                             viewgr->View_ScrollXPos();
  193.                             mreturn MUI_EventHandlerRC_Eat;
  194.                             break;
  195.                         case 78:
  196.                             viewgr->View_ScrollXNeg();
  197.                             mreturn MUI_EventHandlerRC_Eat;
  198.                             break;
  199.                     }
  200.                     break;
  201.                 case IDCMP_MOUSEMOVE:
  202.                     xcoordtxt->Contents = "X 0.0 m";
  203.                     ycoordtxt->Contents = NULL;
  204.                     zcoordtxt->Contents = "Z 0.0 m";
  205.                     break;
  206.             }
  207.         }
  208.         else if (mouseobj == view3)
  209.         {
  210.             switch(msg->imsg->Class)
  211.             {
  212.                 case IDCMP_RAWKEY:
  213.                     switch(msg->imsg->Code)
  214.                     {
  215.                         case 76:
  216.                             viewgr->View_ScrollYPos();
  217.                             mreturn MUI_EventHandlerRC_Eat;
  218.                             break;
  219.                         case 77:
  220.                             viewgr->View_ScrollYNeg();
  221.                             mreturn MUI_EventHandlerRC_Eat;
  222.                             break;
  223.                         case 79:
  224.                             viewgr->View_ScrollXPos();
  225.                             mreturn MUI_EventHandlerRC_Eat;
  226.                             break;
  227.                         case 78:
  228.                             viewgr->View_ScrollXNeg();
  229.                             mreturn MUI_EventHandlerRC_Eat;
  230.                             break;
  231.                     }
  232.                     break;
  233.                 case IDCMP_MOUSEMOVE:
  234.                     xcoordtxt->Contents = "X 0.0 m";
  235.                     ycoordtxt->Contents = "Y 0.0 m";
  236.                     zcoordtxt->Contents = NULL;
  237.                     break;
  238.             }
  239.         }
  240.         else if (mouseobj == view4)
  241.         {
  242.             switch(msg->imsg->Class)
  243.             {
  244.                 case IDCMP_RAWKEY:
  245.                     switch(msg->imsg->Code)
  246.                     {
  247.                         case 76:
  248.                             viewgr->View_ScrollYPos();
  249.                             mreturn MUI_EventHandlerRC_Eat;
  250.                             break;
  251.                         case 77:
  252.                             viewgr->View_ScrollYNeg();
  253.                             mreturn MUI_EventHandlerRC_Eat;
  254.                             break;
  255.                         case 79:
  256.                             viewgr->View_ScrollZNeg();
  257.                             mreturn MUI_EventHandlerRC_Eat;
  258.                             break;
  259.                         case 78:
  260.                             viewgr->View_ScrollZPos();
  261.                             mreturn MUI_EventHandlerRC_Eat;
  262.                             break;
  263.                     }
  264.                     break;
  265.                 case IDCMP_MOUSEMOVE:
  266.                     xcoordtxt->Contents = NULL;
  267.                     ycoordtxt->Contents = "Y 0.0 m";
  268.                     zcoordtxt->Contents = "Z 0.0 m";
  269.                     break;
  270.             }
  271.         }
  272.         else
  273.         {
  274.             if (msg->imsg->Class == IDCMP_MOUSEMOVE)
  275.             {
  276.                 xcoordtxt->Contents = NULL;
  277.                 ycoordtxt->Contents = NULL;
  278.                 zcoordtxt->Contents = NULL;
  279.             }
  280.         }
  281.     }
  282.  
  283.     mreturn 0;
  284. }
  285.  
  286. Method Mainwin::New()
  287. {
  288.     RemAllVertices(Model);
  289.     MUI_Redraw(viewgr,MADF_DRAWOBJECT);
  290. }
  291.  
  292. static __saveds __asm void IntuiMsgFunc(register __a1 struct IntuiMessage *imsg,register __a2 struct FileRequester *req)
  293. {
  294.     if (imsg->Class == IDCMP_REFRESHWINDOW)
  295.         DoMethod(req->fr_UserData,MUIM_Application_CheckRefresh);
  296. }
  297.  
  298. Method Mainwin::Load()
  299. {
  300.     static char buf[512];
  301.     static const struct Hook IntuiMsgHook = { { 0,0 },(void *)IntuiMsgFunc,NULL,NULL };
  302.     Object *app = (Object *)obj->_ApplicationObject;
  303.  
  304.     set(app,MUIA_Application_Sleep,TRUE);
  305.     if (MUI_AslRequestTags(objreq,
  306.         ASLFR_Window,        obj->Window_Window,
  307.         ASLFR_TitleText,    "Load an object",
  308.         ASLFR_DoSaveMode,    FALSE,
  309.         ASLFR_UserData,        app,
  310.         ASLFR_IntuiMsgFunc,    &IntuiMsgHook,
  311.         TAG_DONE,0))
  312.     {
  313.         if (*objreq->fr_File)
  314.         {
  315.             stccpy(buf,objreq->fr_Drawer,sizeof(buf));
  316.             AddPart(buf,objreq->fr_File,sizeof(buf));
  317.  
  318.             LoadModel(buf,Model);
  319.             MUI_Redraw(viewgr,MADF_DRAWOBJECT);
  320.         }
  321.     }
  322.     set(app,MUIA_Application_Sleep,FALSE);
  323. }
  324.  
  325. static char *getfilename(Object *win,char *title,char *dir,char *pattern,char save)
  326. {
  327.     static char buf[512];
  328.     struct FileRequester *req;
  329.     struct Window *w;
  330.     static long left=-1,top=-1,width=-1,height=-1;
  331.     Object *app = (Object *)BCC_XGet(win,MUIA_ApplicationObject);
  332.     char *res = NULL;
  333.     static const struct Hook IntuiMsgHook = { { 0,0 },(VOID *)IntuiMsgFunc,NULL,NULL };
  334.  
  335.     get(win,MUIA_Window_Window,&w);
  336.     if (left==-1)
  337.     {
  338.         left   = w->LeftEdge+w->BorderLeft+2;
  339.         top    = w->TopEdge+w->BorderTop+2;
  340.         width  = w->Width-w->BorderLeft-w->BorderRight-4;
  341.         height = w->Height-w->BorderTop-w->BorderBottom-4;
  342.     }
  343.  
  344.     if (req=MUI_AllocAslRequestTags(ASL_FileRequest,
  345.         ASLFR_Window, w,
  346.         ASLFR_TitleText, title,
  347.         ASLFR_InitialLeftEdge, left,
  348.         ASLFR_InitialTopEdge , top,
  349.         ASLFR_InitialWidth   , width,
  350.         ASLFR_InitialHeight  , height,
  351.         ASLFR_InitialDrawer  , dir,
  352.         ASLFR_InitialPattern , pattern,
  353.         ASLFR_DoSaveMode     , save,
  354.         ASLFR_DoPatterns     , TRUE,
  355.         ASLFR_RejectIcons    , TRUE,
  356.         ASLFR_UserData       , app,
  357.         ASLFR_IntuiMsgFunc   , &IntuiMsgHook,
  358.         TAG_DONE))
  359.     {
  360.         set(app,MUIA_Application_Sleep,TRUE);
  361.         if (MUI_AslRequestTags(req,TAG_DONE))
  362.         {
  363.             if (*req->fr_File)
  364.             {
  365.                 res = buf;
  366.                 stccpy(buf,req->fr_Drawer,sizeof(buf));
  367.                 AddPart(buf,req->fr_File,sizeof(buf));
  368.             }
  369.             left   = req->fr_LeftEdge;
  370.             top    = req->fr_TopEdge;
  371.             width  = req->fr_Width;
  372.             height = req->fr_Height;
  373.         }
  374.         MUI_FreeAslRequest(req);
  375.         set(app,MUIA_Application_Sleep,FALSE);
  376.     }
  377.     return(res);
  378. }
  379.  
  380. Method Mainwin::ZoomIn()
  381. {
  382.     obj->Zoom = f2l(Zoom * 1.25);
  383. }
  384.  
  385. Method Mainwin::ZoomOut()
  386. {
  387.     obj->Zoom = f2l(Zoom / 1.25);
  388. }
  389.  
  390. Attribute Mainwin::Zoom:S(long zoom)
  391. {
  392.     char buf[64];
  393.  
  394.     Zoom = l2f(zoom);
  395.  
  396.     GridSize = pow(10.0,floor(log10(0.1 / Zoom)));
  397.     if (fract(log10(1.0 / Zoom)) > 0.699) GridSize *= 5.0;
  398.     else if (fract(log10(1.0 / Zoom)) > 0.301) GridSize *= 2.0;
  399.  
  400.     if (GridSize >= 1000000.0)
  401.         sprintf(buf,"Grid: %d Mm",(long)(GridSize / 1000000.0));
  402.     else if (GridSize >= 1000.0)
  403.         sprintf(buf,"Grid: %d km",(long)(GridSize / 1000.0));
  404.     else if (GridSize >= 1.0)
  405.         sprintf(buf,"Grid: %d m",(long)GridSize);
  406.     else if (GridSize >= 0.01)
  407.         sprintf(buf,"Grid: %d cm",(long)(GridSize * 100.0));
  408.     else
  409.         sprintf(buf,"Grid: %d mm",(long)(GridSize * 1000.0));
  410.  
  411.     gridsizetxt->Contents = buf;
  412.  
  413.     viewgr->View_Zoom = f2l(Zoom);
  414.     viewgr->View_GridSize = f2l(GridSize);
  415.     MUI_Redraw(viewgr,MADF_DRAWOBJECT);
  416. }
  417.  
  418.